今天也會引用Youtuber「neurotrader」的程式碼,他在影片「Automated Price Trend Lines in Python」中提到一種方法可以在區間內找出一條支撐線(support line)與一條壓力線(resistance line)。因為該方式用到區間概念,因此會先說明「直線趨勢線的周期」。
與其他技術分析工具不同,直線趨勢線可以自行決定天期區間和長短。
因此可靈活運用直線趨勢線,且不同趨勢線可代表不同期間,短、中、長期趨勢的多空、強弱和支撐壓力。
自動價格趨勢線函式的程式碼如下所示:
# 來源 : https://github.com/neurotrader888/TechnicalAnalysisAutomation/blob/main/trendline_automation.py
from myutils.TrendlineAutomation import fit_trendlines_single
from myutils.TrendlineAutomation import fit_trendlines_high_low
def FitTrendlines(prices, mode = 'close') :
# 價格資料確認與處理
if prices is None and type(prices) is not DataFrame:
return None
in_prices = prices.copy()
if 'Open' not in in_prices.columns or 'High' not in in_prices.columns or 'Low' not in in_prices.columns or 'Close' not in in_prices.columns :
return None
if 'Date' not in in_prices.columns and in_prices.index.dtype == 'datetime64[ns]' :
in_prices.index.name = 'Date'
in_prices = in_prices.reset_index()
if 'Date' not in in_prices.columns :
return None
# 模式確認與處理
prices_close=np.array(in_prices['Close'])
if mode == 'close' :
pass
elif mode == 'high_low' :
prices_high=np.array(in_prices['High'])
prices_low=np.array(in_prices['Low'])
else :
return None
# 擬合趨勢線
if mode == 'close' :
trendlines = fit_trendlines_single(prices_close)
elif mode == 'high_low' :
trendlines = fit_trendlines_high_low(prices_high,prices_low,prices_close)
# 輸出格式處理
trendline_start_index = in_prices.iloc[0].name
trendline_end_index = in_prices.iloc[-1].name
trendline_start_date = in_prices.iloc[0]['Date'].strftime('%Y-%m-%d')
trendline_end_date = in_prices.iloc[-1]['Date'].strftime('%Y-%m-%d')
support_slope = trendlines[0][0]
support_intercept = trendlines[0][1]
support_trendline_start_price = support_slope * trendline_start_index + support_intercept
support_trendline_end_price = support_slope * trendline_end_index + support_intercept
resist_slope = trendlines[1][0]
resist_intercept = trendlines[1][1]
resist_trendline_start_price = resist_slope * trendline_start_index + resist_intercept
resist_trendline_end_price = resist_slope * trendline_end_index + resist_intercept
# 回傳資料處理
ret_trendlines = [[(trendline_start_date,support_trendline_start_price),(trendline_end_date,support_trendline_end_price)],
[(trendline_start_date,resist_trendline_start_price),(trendline_end_date,resist_trendline_end_price)]]
return (trendlines,ret_trendlines)
在這邊先說明引用neurotrader程式的部分,用到兩個函式:
兩個函式回傳都是支撐線與壓力線的斜率與截距,也就是直線方程式斜截式的兩個參數;可以參照Day8程式實作之說明。
其他程式碼內容以條列式方式的挑重點敘述:
將區間的價格資料(開、高、低、收、量)送入自動趨勢線函式。程式碼如下所示:
_,trendlines = FitTrendlines(df_k_line['2022-10-25':])
由於股票老師的「多頭看支撐不看壓力,空頭看壓力不看支撐」原則,因此只保留支撐線(上升趨勢線)。程式碼如下:
trendlines = trendlines[0]
之後利用以下程式繪製支撐線(上升趨勢線)與K線圖:
# 設定K線格式
mc = mpf.make_marketcolors(up='xkcd:light red', down='xkcd:almost black', inherit=True)
s = mpf.make_mpf_style(base_mpf_style='yahoo', marketcolors=mc)
# 設定支撐線與壓力線
seq_of_seq_of_points=trendlines
# 繪出K線圖
kwargs = dict(type='candle', style=s, figratio=(19,10), alines=dict(alines=seq_of_seq_of_points, linewidths=1.0, colors='xkcd:red', alpha=0.6), datetime_format='%Y-%m-%d')
mpf.plot(df_k_line,**kwargs)
程式執行結果如下:
完整的程式碼請參照「第十一天:自動價格趨勢線.ipynb」。
今天實作了Day1主觀性質客觀化的第二種方式(利用演算法以自動化方式來找尋或識別型態)於趨勢線課題上,但自動化程序還是會存在著無法完全涵蓋之處。而在我的8月30日股票投資筆記,其中有一段話剛好符合這個議題的討論:「只要符合趨勢線和型態學的理論依據,要怎麼畫都可以,這也正是形態學難學之處,因為可能同時存在多種圖形,而使用的人必須透過經驗去判斷,哪一種型態成型的機率最高。其實,技術分析裡面形態學跟價量關係,是最難的,因為很難制定訂出標準的SOP,很多都是經驗值和獨立事件,實務上應用,真的要靠多一些經驗值,因為變化太多了。所以像程式交易是無法完整的涵蓋形態學跟價量關係,偏偏這兩件事情,又非常重要」。因此主觀性質客觀化的第一種方式(將在看盤軟體繪製的圖形與線段以人工方式轉換成數據)還是有其存在的必要,並且這兩種方式的應用應該是互補而非互斥。